package com.lpf.api.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.alibaba.fastjson.JSONObject;
import com.lpf.base.BaseApiService;
import com.lpf.base.ResponseBase;
import com.lpf.entity.AppEntity;
import com.lpf.mapper.AppMapper;
import com.lpf.utils.BaseRedisService;
import com.lpf.utils.TokenUtils;

/**
 * 功能描述：创建获取getAccessToken
 */
@RestController
@RequestMapping(value = "/auth")
public class AuthController extends BaseApiService {

    @Autowired
    private BaseRedisService baseRedisService;

    private long timeToken = 60 * 60 * 2;

    @Autowired
    private AppMapper appMapper;

    /**
     * 功能描述：使用 appId+appSecret 生成AccessToke
     */
    @RequestMapping("/getAccessToken")
    public ResponseBase getAccessToken(AppEntity appEntity) {

        // 1、获取生成对应appId和appSecret，验证是否可用
        AppEntity appResult = appMapper.findApp(appEntity);
        if (appResult == null) {
            return setResultError("没有对应机构的认证信息");
        }

        int isFlag = appResult.getIsFlag();
        if (isFlag == 1) {
            return setResultError("您现在没有权限生成对应的AccessToken");
        }

        // 2、获取新的accessToken之前删除之前老的accessToken
        // 从redis中删除之前的accessToken
        String accessToken = appResult.getAccessToken();
        baseRedisService.delKey(accessToken);

        // 3、生成新的accessToken
        String newAccessToken = newAccessToken(appResult.getAppId());

        JSONObject jsonObject = new JSONObject();
        jsonObject.put("accessToken", newAccessToken);

        // 4、返回新的accessToken
        return setResultSuccessData(jsonObject);
    }

    private String newAccessToken(String appId) {

        // 使用appId+appSecret生成对应的AccessToken，保存两个小时
        String accessToken = TokenUtils.getAccessToken();

        // 保证在同一个事务中 redis 事物中
        // 生成最新的token：key为accessToken，value为appId
        baseRedisService.setString(accessToken, appId, timeToken);

        // 表中保存当前accessToken
        appMapper.updateAccessToken(accessToken, appId);

        return accessToken;
    }
}
